package ThreadRunableVolite;

//import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * 
 * @author zybw-kf01
 *如何让两个线程依次执行？
 *那如何让 两个线程按照指定方式有序交叉运行呢？
 *还是上面那个例子，我现在希望 A 在打印完 1 后，再让 B 打印 1, 2, 3，最后再回到 A 继续打印 2, 3。这种需求下，显然 Thread.join() 已经不能满足了。我们需要更细粒度的锁来控制执行顺序。
 *这里，我们可以利用 object.wait() 和 object.notify() 两个方法来实现
 */
public class ThreadOrder3 {

	public static void main(String[] args) {

		Object lock = new Object();
		Thread aThread = new Thread(new Runnable() {

			@Override
			public void run() {
				
				System.out.println("A 等待锁。。。");
				synchronized (lock) {
					System.out.println("A拿到锁");
					System.out.println("A 1");
					try {
						System.out.println("A 准备进入等待状态，调用 lock.wait() 放弃锁 lock 的控制权");
						lock.wait();
						 System.out.println("INFO: 有人唤醒了 A, A 重新获得锁 lock");
						System.out.println("A 2");
						System.out.println("A 3");
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

				}
			}
		});

		Thread bThread = new Thread(new Runnable() {

			@Override
			public void run() {

				System.out.println("B 等待锁。。。");
				synchronized (lock) {
					System.out.println("B拿到锁");
					System.out.println("B 1");
					System.out.println("B 2");
					System.out.println("B 3");
					System.out.println("INFO: B 打印完毕，调用 notify 方法");
					lock.notify();
				}
			}
		});

		aThread.start();
		bThread.start();

	}

	private static void printNumber(String threadName) {
		int i = 0;

		while (i++ < 3) {
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(threadName + " print: " + i);
		}
	}
}
